[7. Programacion de Sockets con W32 ASM. Parte 1 ]===========================================]
[By ErGrone ]================================================================================]
[============================================================================================]

Bueno aca va el documento, la primera parte de programacion de sockets con W32 ASM (es la 
primera parte porque una vez finalizado sera un manual). con esta 1a parte se aprendera a 
establecer una conexion TCP y si ellector es vivo con un cambio establece conexiones UDP, 
en la 2a parte ira el metodo de comunicarse. Epero que les guste y hasta la proxima.


I. Inicializacion
------------------

Estructura.

WSADATA		struct              
mVersion	dw	0           
mHighVersion	dw	0           
szDescription	db	257 dup()  
szSystemStatus	db	129 dup()  
iMaxSockets	dw	0           
iMaxUpdDg	dw	0           
lpVendorInfo	dd	0           
WSADATA		ends


Antes de crear un socket debemos inicializar el uso de este, y decir que version utilizaremos.

1) push offset wsadata
2) push 0101h 
3) call WSAStartup 	
4) cmp  eax,0          				    
5) jne  chao 

1) Empujamos a la pila la offset de la estructura
2) Empujamos a la pila la versin de Socket que utilizaremos. se utilizan las mas baja para 
   compatibilidades.
3) Llamamos a WSAStartup, para inicializar.

Si todo ha salido bien EAX retornara igual a 0. 


II.  Creacion del socket
-------------------------

1)	push 0 
2)	push 1
3)	push 2
4)	call socket
5)	cmp eax, -1
6)	jne Perfectus
7)           Perfectus mov Sjandle,eax



1) push 0

Protocolo, en este caso utilizamos PCL_NONE, o sea, ninguno, para evitar fallas y asi
permitir que el socket elija el tipo.

2) push 1

El tipo de socket, existen dos el TCP y UDP (SOCK_STREAM y SOCK_DGRAM). en este caso estamos 
   utilizando TCP.

3) push 2

La familia (af - Address family specification). utilizamos AF_INET, pues utilizaremos nuestro 
socket en la internet.

4) call socket

Llamamos a la API socket, la cual nos retornara un handle en EAX, que es el descriptor del 
socket creado. En caso de que el socket se cree con error, EAX retornar como -1.


III. Conectar a un puerto
--------------------------

SOCKADDR        struct

familia	   	  dw	0		
puerto		  dw	0		
direcc	      	  dd         0       	
zero		  db	8 dup()	
SOCKADDR        ends

tamstruct  equ SIZE SOCKADDR ; tamao de la estructura SOCKADDR

Una vez creado el socket, movemos a sockaddr.direcc, la ip a la cual queremos conectar, 
luego empujamos a la pila el puerto al cual conectaremos, acto seguido llamamos a htons.

Con htons transformamos el numero del puerto a bytes de red y retorna a AX, luego procedemos
a guardar aquel valor en sockaddr.puerto, metemos en sockaddr.familia la familia .

Los pasos finales son, empujar a la pila el tamao de la estructura en bytes, la offset donde 
esta se encuentra , el handle (descriptor) de nuestro socket y por ultimo procedemos a llamar 
a connect.
		

		mov dword ptr [sockaddr.direcc],eax
              
           		push 80   ;puerto				
		call htons                           
		mov word ptr [sockaddr.puerto],ax 
		mov word ptr [sockaddr.familia],2

		push tamstruct			
		push offset sockaddr			
		push Sjandle		
	
		call connect    

Si todo a salido bien, EAX retornara distinto de -1. luego de esto ya estaremos con conexion 
establecida.

Bueno eso es todo y hasta la proxima... 




